/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vendingmachine;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author JonathanEry
 */
public class ProductStorage {
    private List<List<Product>> tray;
    private final int maxTray = 10;
    private final int maxProduct = 50;
            
    public ProductStorage() throws FileExp{
        this.tray = new ArrayList<>(maxTray);
        ReadFile("file.txt");
    }

    public List<List<Product>> getTray() {
        return tray;
    }
    
    public Product getProduct(int id){
        if (id>=0 && id<tray.size()){
            if (tray.get(id).size() > 0){
                return tray.get(id).remove(tray.get(id).size()-1);
            }else{
                return new Product(-1);
            }
        }else{
            return new Product();
        }
    }
    
    public int getPrice(int id){
        if (id>=0 && id<tray.size()){
            if (tray.get(id).size() > 0){
                return tray.get(id).get(tray.get(id).size()-1).getPrice();
            }else{
                return 0;
            }
        }else{
            return 0;
        }
    }
    
    public void refillAllProduct(){
        for (int i = 0;i<tray.size();i++){
            for (int j = tray.get(i).size(); j<maxProduct;j++){
                tray.get(i).add(new Product(tray.get(i).get(j-1)));
            }
        }
    }
    
    public boolean isTrayEmpty(){
        return tray.isEmpty();
    }
    
    public boolean isProductsEmpty(){
        if(!isTrayEmpty()){
            int i = 0;
            while(i < tray.size() && !tray.get(i).isEmpty()){
                i++;
            }
            if(i >= tray.size()){
                return false;
            }else{
                return true;
            }
        }else {
            return true;
        }
    }
    
    /** Method File **/
    public void ReadFile(String NamaFile) throws FileExp{
    /* Proses : Membaca file dari NamaFile, kemudian menyimpan isinya ke memori tray product dengan jumlah maksimal sesuai yang telah ditentukan */ 
    /* I.S : tray telah dibuat, NamaFile terfdefinisi, format isi dan jumlahnya sesuai (0 <= tray <= 10 dan 0 <= produk <=50) */
    /* F.S : Objek terisi data yang berasal dari NamaFile */
        //Kamus
        String line;
        //int NTray;

        //Algoritma

        //menghapus list jika sudah ada (akan menimpa kalender yang sudah ada)
        if (tray.size() > 0){
            for(List<Product> listProd: tray){
                listProd.clear();
            }
            tray.clear();
        }

        FileInputStream fstream;
        BufferedReader input = null;
        try {
            fstream = new FileInputStream(NamaFile);
            input = new BufferedReader(new InputStreamReader(fstream));
            
            this.tray = new ArrayList<>(maxTray);
            
            //pasang jumlah tray		
            line = input.readLine();
            int NTray = Integer.parseInt(line);
            
            //cek jumlah
            assert(NTray >= 0 && NTray <= maxTray): "Jumlah jenis produk pada file tidak sesuai dengan jumlah tempat penyimpanan";
            if(NTray > 0){
                //iterasi setiap jenis produk
                for(int i = 0; i < NTray; i++){
                    List<Product> temp = new ArrayList<>(maxProduct);
                            
                    //baca jumlah produk
                    line = input.readLine();
                    int NProd = Integer.parseInt(line);

                    //cek jumlah produk
                    assert(NProd >= 0 && NProd <= 50): "Jumlah produk pada file tidak sesuai dengan jumlah tempat penyimpanan";
                    if(NProd > 0){
                        
                        for(int j = 0; j < NProd; j++){
                            //membaca nomor id produk
                            line = input.readLine();
                            int num = Integer.parseInt(line);
                            
                            //membaca nama produk
                            line = input.readLine();
                            String name = line.toString();

                            //membaca harga produk
                            line = input.readLine();
                            int price = Integer.parseInt(line);
                            
                            Product prod = new Product(num, name, price);
                            temp.add(prod);
                        }
                    }
                    
                    this.tray.add(temp);
                }
            }
        } catch (IOException | NumberFormatException e) {
            System.out.println(e.getMessage());
            throw (new FileExp(e.getMessage()));
        } finally {
            try {
                if(input != null){
                    input.close();
                }
            } catch(Exception e) {
            }
        }
    }

    public void SaveFile(String NamaFile) throws FileExp{
    /* Proses : Menuliskan elemen-elemen Product ke dalam File NamaFile */
    /* I.S	: NamaFile terdefinisi, Product berisi elemen yang akan dituliskan ke file */
    /* F.S	: File yang bernama NamaFile terbentuk, dan berisi elemen Product */
        FileOutputStream fstream;
        BufferedWriter output = null;
        try{
            fstream = new FileOutputStream(NamaFile);
            output = new BufferedWriter(new OutputStreamWriter(fstream));
            
            //menulis jumlah tray
            output.write(Integer.toString(tray.size()));
            output.newLine();
            
            //menulis semua product dalam setiap tray
            if(tray.size() > 0){
                for(List<Product> listProd: tray){
                    //menulis jumlah produk dalam suatu tray
                    output.write(Integer.toString(listProd.size()));
                    output.newLine();
                    
                    //menulis semua produk dalam suatu tray
                    if(listProd.size() > 0){
                        for(Product prod: listProd){
                            //menulis nomor id produk
                            output.write(Integer.toString(prod.getId()));
                            output.newLine();

                            //menulis nama produk
                            output.write(prod.getName());
                            output.newLine();

                            //menulis harga produk
                            output.write(Integer.toString(prod.getPrice()));
                            output.newLine();
                        }
                    }
                }
            }
        }catch(Exception e){
            System.out.println(e.getMessage());
            throw (new FileExp(e.getMessage()));
        }finally{
            try {
                if(output != null){
                    output.close();
                }
            } catch(Exception e) {
            }
        }
    }
}
